package com.example.strategy.strategy;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @Auther: chenxiuqi
 * @Date: 2020/4/27 21:23
 * @Description:
 */
@Component
public class MyStrategyReflexContent implements ApplicationContextAware,InitializingBean {

    private Map<String, MyStrategy> beanMap ;

    private ApplicationContext applicationContext;


    /**
     * 实现ApplicationContextAware接口，Spring容器会在创建MyStragtrgyReflexContent类之后，
     * 自动调用实现接口的setApplicationContextAware()方法，
     * 调用该方法时，会将ApplicationContext(容器本身)作为参数传给该方法，
     * 我们可以在该方法中将Spring传入的参数ApplicationContext赋给MyStragtrgyReflexContent对象的applicationContext实例变量，因此接下来可以通过该applicationContext实例变量来访问容器本身。
     *
     * 作者：那我懂你意思了_de16
     * 链接：https://www.jianshu.com/p/e435dd6c7339
     * 来源：简书
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     * @param applicationContext
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    /**
     * 实现InitializingBean接口，该接口提供了afterPropertiesSet方法。
     * spirng容器在初始化bean的时候会执行afterPropertiesSet方法，
     * 我们可以在该方法中调用applicationContext接口提供的getBeansOfType方法获得实现MyStragtegy类的Bean，将之存储至map集合中
     *
     * 作者：那我懂你意思了_de16
     * 链接：https://www.jianshu.com/p/e435dd6c7339
     * 来源：简书
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        Map<String, MyStrategy> map = applicationContext.getBeansOfType(MyStrategy.class);
        this.beanMap = map;
    }

    public MyStrategy getMyStrategy(String beanName){
        return this.beanMap.get(beanName);
    }



}
